package cn.com.bluemoon.daps.sync.service;

import cn.com.bluemoon.daps.common.domain.UserInfoHolder;
import cn.com.bluemoon.daps.common.enums.SyncToEnv;
import cn.com.bluemoon.daps.model.dto.ModelTableDto;
import cn.com.bluemoon.daps.sync.core.sync.GlobalConfig;
import cn.com.bluemoon.daps.sync.core.sync.TableModel;
import cn.com.bluemoon.daps.sync.core.sync.log.SyncEnvLog;
import cn.com.bluemoon.daps.sync.entity.DapSyncProdEnvTask;
import reactor.util.function.Tuple2;

import java.util.List;
import java.util.Set;

/**
 * 同步结构相关的基础类
 *
 * @author Jarod.Kong
 * @date 2021/6/16 20:22
 */
public interface DapSyncBasicService {
    /**
     * 根据模型id构建同步的全局基础参数
     *
     * @param modelId   模型id
     * @param syncToEnv 同步到
     * @return GlobalConfig
     */
    public GlobalConfig buildSyncGlobalConfig(String modelId, SyncToEnv syncToEnv);

    /**
     * 根据模型id构建同步的全局基础参数
     * 不尝试连接数据库
     *
     * @param modelId   模型id
     * @param syncToEnv 同步到
     * @param userInfo  执行人-用户信息
     * @return GlobalConfig
     */
    public GlobalConfig buildSyncGlobalConfig(String modelId, SyncToEnv syncToEnv, UserInfoHolder.UserInfo userInfo);
    /**
     * 根据模型id构建同步的全局基础参数
     *
     * @param modelId      模型id
     * @param syncToEnv    同步到
     * @param userInfo     执行人-用户信息
     * @param tryConnectDb 尝试连接数据库，若失败则爆出异常
     * @return GlobalConfig
     */
    public GlobalConfig buildSyncGlobalConfig(String modelId,
                                              SyncToEnv syncToEnv,
                                              UserInfoHolder.UserInfo userInfo,
                                              boolean tryConnectDb);
    /**
     * 根据模型id构建同步的全局基础参数
     *
     * @param modelId      模型id
     * @param syncToEnv    同步到
     * @param userInfo     执行人-用户信息
     * @param tryConnectDb 尝试连接数据库，若失败则爆出异常
     * @param selectedGroupId 选择导入模型的哪个组中，可为null，null为默认组，非空取指定id（若为空则取默认组）
     * @param logBizId      日志任务id（日志存储id）
     * @return GlobalConfig
     */
    public GlobalConfig buildSyncGlobalConfig(String modelId, SyncToEnv syncToEnv, UserInfoHolder.UserInfo userInfo, boolean tryConnectDb, String selectedGroupId, String logBizId);

    default GlobalConfig buildSyncGlobalConfig(String modelId, SyncToEnv syncToEnv, UserInfoHolder.UserInfo userInfo, boolean tryConnectDb, String selectedGroupId) {
        return buildSyncGlobalConfig(modelId, syncToEnv, userInfo, tryConnectDb, selectedGroupId, null);
    }


    /**
     * 获取模型信息
     *
     * @return list
     */
    public List<ModelTableDto> getLocalModelTableDtos(GlobalConfig globalConfig);

    /**
     * @return 获取模型对应的开发库的数据集
     */
    public List<TableModel> getMetadataTableModel(GlobalConfig globalConfig, Set<String> tableIds);

    /**
     * @return 获取模型对应的开发库的数据集
     */
    public List<TableModel> getMetadataTableModel(GlobalConfig globalConfig);

    /**
     * @return 获取本地模型的数据集
     */
    public List<TableModel> getLocalTableModel(GlobalConfig globalConfig);

    /**
     * 根据SyncToEnv情况进行过滤表，若SyncToEnv为空则不过滤
     *
     * @param tableNames set
     * @return 获取本地+元数据集+过滤非所选表
     */
    @Deprecated
    public Tuple2<List<TableModel>, List<TableModel>> getLocalAndMetadataTableModel(GlobalConfig globalConfig,
                                                                                    Set<String> tableNames);

    /**
     * @return 获取本地+元数据集+过滤非所选表
     */
    public Tuple2<List<TableModel>, List<TableModel>> getLocalAndMetadataTableModel(GlobalConfig globalConfig);

    /**
     * 发送环境邮件
     *
     * @param syncEnvLog 开发同步、发布同步日志
     * @param async      异步
     */
    public void sendDevEmail(SyncEnvLog syncEnvLog, GlobalConfig globalConfig, boolean async);
    /**
     * 不异步发送环境邮件
     *
     * @param syncEnvLog 开发同步、发布同步日志
     */
    void sendDevEmail(SyncEnvLog syncEnvLog);

    /**
     * 不异步发送环境邮件
     *
     * @param syncEnvLog 开发同步、发布同步日志
     */
    public void sendDevEmail(SyncEnvLog syncEnvLog, GlobalConfig globalConfig);

    /**
     * 发送环境邮件
     *
     * @param task      任务单号
     * @param globalConfig 环境类型
     */
    public void sendEmailPublishSync(DapSyncProdEnvTask task, GlobalConfig globalConfig, boolean async);


    /**
     * 发送同步管理邮件
     *
     * @param task      任务单号
     * @param globalConfig 环境类型
     */
    void sendEmailPublishSyncFromSyncManagement(DapSyncProdEnvTask task, GlobalConfig globalConfig);

    /**
     * 不异步发送环境邮件
     *  @param task      任务单号
     * @param globalConfig 环境类型
     */
    public void sendEmailPublishSync(DapSyncProdEnvTask task, GlobalConfig globalConfig);

}
